// Copyright (c) 2011, http://code.google.com/p/example-xplane-plugins/
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * Neither the name of "example-xplane-plugins" nor the
//       names of its contributors may be used to endorse or promote products
//       derived from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL "example-xplane-plugins" BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


#ifndef XPAIRCRAFT_H
#define XPAIRCRAFT_H

#include "XPLMDataAccess.h"

static const int MAX_AIRCRAFT(20);

static const int UNBOUND_AIRCRAFT_INDEX(-1);
static const int USER_AIRCRAFT_INDEX(0);
static const int MIN_MULTI_AIRCRAFT_INDEX(1);
static const int MAX_MULTI_AIRCRAFT_INDEX(9);

class XPAircraft
{
public:
  XPAircraft();
  ~XPAircraft();

  static int AcquireAllAircraft();
  static void XPAircraft::ReleaseAllAircraft();


  inline bool GetOverrideXPlaneState() const { return m_overrideXPlane; }
  void SetOverrideXPlaneState(const bool overrideXPlane);

protected:

  void BindToXPlaneAircraft(const int aircraftIndex);

  void SetXPlaneAircraft_LLA(
    const double latitudeDeg, const double longitudeDeg, const double altitudeM, 
    const float headingDeg, const float pitchDeg, const float rollDeg);

  void SetXPlaneAircraft_XYZ(
    double X, double Y, double Z,
    float headingDeg, float pitchDeg, float rollDeg);

  void GetXPlaneAircraft_LLA(
    double& latitudeDeg, double& longitudeDeg, double& altitudeM,
    float& headingDeg, float& pitchDeg, float& rollDeg);

  void GetXPlaneAircraft_XYZ(
    double& X, double& Y, double& Z,
    float& headingDeg, float& pitchDeg, float& rollDeg);

private:

  void InitialiseDatarefs();

  // Static members
  static int s_totalAcquiredAircraft;
  static char s_filenames[MAX_AIRCRAFT][MAX_PATH];
  static char s_filepaths[MAX_AIRCRAFT][MAX_PATH];
  static char* s_inAircraft[MAX_AIRCRAFT];

  static int s_overrideFlags[MAX_AIRCRAFT];


  // Normal members
  int m_aircraftIndex;
  bool m_overrideXPlane;

  // XPlane
  XPLMDataRef m_aircraftOverrideID;

  XPLMDataRef m_aircraftXPosID;
  XPLMDataRef m_aircraftYPosID;
  XPLMDataRef m_aircraftZPosID;

  XPLMDataRef m_aircraftHeadingDegID;
  XPLMDataRef m_aircraftPitchDegID;
  XPLMDataRef m_aircraftRollDegID;
};

#endif





